Skip to content

Conversation

@MananTank
Copy link
Member

@MananTank MananTank commented Jun 20, 2025


PR-Codex overview

This PR focuses on restructuring and renaming various components and files related to "assets" to "tokens" throughout the application. It also removes several unused files and updates references to maintain functionality.

Detailed summary

  • Deleted several unused files in the nebula and in-app-wallets directories.
  • Renamed files and components from "assets" to "tokens" in various locations.
  • Updated redirect paths and links to reflect the new "tokens" terminology.
  • Adjusted import paths for consistency with new structure.
  • Enhanced UI elements in various components for better user experience.
  • Added new Vault layout and components for improved functionality.
  • Introduced new webhook management features and updated related components.

The following files were skipped due to too many changes: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/create-vault-account.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/layout.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/ftux.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/layout.tsx, apps/dashboard/redirects.js, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/contract-webhooks/contract-webhooks-page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/components/try-it-out.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/layout.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/key-management.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx, apps/dashboard/src/components/pay/PayAnalytics/PayEmbedFTUX.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/wallet-table/wallet-table-ui.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx, packages/nebula/package.json, pnpm-lock.yaml

✨ Ask PR-Codex anything about this PR by commenting with /codex {your question}

Summary by CodeRabbit

  • New Features

    • Introduced a Vault section with a new layout and comprehensive key management UI.
    • Added enhanced contract webhooks management with dedicated pages and navigation.
  • Improvements

    • Renamed "Assets" to "Tokens" and "In-App Wallets" to "Wallets" across the dashboard.
    • Updated sidebar navigation labels, icons, and link destinations for improved clarity.
    • Rebranded "Engine" to "Transactions" with updated routes and UI components.
    • Refined onboarding and FTUX experiences with clearer terminology and instructional content.
    • Enhanced contract import and table UI with updated labels and empty state messages.
    • Enriched Pay analytics with detailed code examples and a more flexible FTUX component.
    • Streamlined redirects and URL paths by removing deprecated segments for smoother navigation.
    • Improved pagination display and active link detection in navigation components.
    • Adjusted layout spacing, button sizes, and typography for better visual consistency.
    • Updated footer and sidebar styling to enhance user experience.
  • Bug Fixes

    • Fixed redirect and navigation paths to align with updated route structures.
    • Improved handling of pagination and active link states in navigation components.
  • Removals

    • Removed Nebula analytics pages, components, and related tracking utilities.
    • Deleted unused tracking properties and constants.
    • Replaced outdated Vault key management component with a new implementation.
  • Documentation

    • Updated terminology in documentation and UI to consistently use "tokens" instead of "assets".
    • Revised analytics event descriptions to reference "token page" terminology.

@MananTank MananTank requested review from a team as code owners June 20, 2025 19:54
@changeset-bot
Copy link

changeset-bot bot commented Jun 20, 2025

⚠️ No Changeset found

Latest commit: eeb672d

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

💥 An error occurred when fetching the changed packages and changesets in this PR
Some errors occurred when validating the changesets config:
The package or glob expression "thirdweb-login" is specified in the `ignore` option but it is not found in the project. You may have misspelled the package name or provided an invalid glob expression. Note that glob expressions must be defined according to https://www.npmjs.com/package/micromatch.

@vercel
Copy link

vercel bot commented Jun 20, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
nebula ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 21, 2025 0:43am
thirdweb_playground ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 21, 2025 0:43am
thirdweb-www ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 21, 2025 0:43am
3 Skipped Deployments
Name Status Preview Comments Updated (UTC)
docs-v2 ⬜️ Skipped (Inspect) Jun 21, 2025 0:43am
login ⬜️ Skipped (Inspect) Jun 21, 2025 0:43am
wallet-ui ⬜️ Skipped (Inspect) Jun 21, 2025 0:43am

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jun 20, 2025

## Walkthrough

This change set extensively restructures the dashboard's product navigation and grouping on the project page. It introduces new sidebar navigation logic and components, renames and reorganizes product sections (such as "Engine" to "Transactions" and "In-App Wallets" to "Wallets"), updates routes and labels across the app, and removes or replaces legacy/obsolete Nebula-related code.

## Changes

| File(s) / Path(s)                                                                                      | Change Summary                                                                                                                                                                                                                           |
|--------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| .../redirects.js                                                                                       | Consolidated and expanded project route redirects for legacy paths; introduced `projectPageRedirects` array.                                                                                                                             |
| .../Sidebar.tsx, .../SidebarLayout.tsx, .../NavLink.tsx                                                | Sidebar link type and navigation updated to support custom active logic.                                                                                                                          |
| .../blocks/UpsellBannerCard.tsx, .../UpsellBannerCard.stories.tsx, .../FreePlanUpsellBannerUI.tsx      | Removed tracking props from UpsellBannerCard and related stories/usages.                                                                                                                          |
| .../analytics/report.ts, .../primary-dashboard-button.tsx, .../ContractOverviewPage.tsx                | Changed references and UI text from "asset page" to "token page".                                                                                                                                 |
| .../contracts/DeployedContractsPageHeader.tsx, .../DeployedContractsPage.tsx                           | Refactored contracts page layout, added description, adjusted spacing and header.                                                                                                                 |
| .../account-abstraction/*, .../engine/cloud/vault/components/key-management.tsx                        | Refactored account abstraction and vault components, updated import paths, and removed/added key management UI.                                                                                   |
| .../nebula/* (multiple files)                                                                          | **Deleted all Nebula analytics, FTUX, and layout files**; removed Nebula product from navigation and replaced with "Universal Bridge" and "Vault".                                                |
| .../tokens/*, .../assets/*                                                                             | Changed "assets" terminology to "tokens" in UI, routes, and logic; updated import paths.                                                                                                          |
| .../transactions/*, .../engine/*                                                                       | Renamed "Engine" to "Transactions" throughout navigation, layout, and related components; updated routing and UI.                                                                                 |
| .../vault/*                                                                                            | Introduced new Vault layout and key management components, updated related import paths.                                                                                                          |
| .../wallets/*                                                                                          | Renamed "In-App Wallets" to "Wallets", updated all related routes, links, and UI.                                                                                                                |
| .../webhooks/*                                                                                         | Refactored webhooks section: new layout, contract/universal bridge tabs, new button/component names, and moved button positions.                                                                  |
| .../components/blocks/Sidebar.tsx, .../SidebarLayout.tsx, .../ui/NavLink.tsx                           | Added support for custom active state logic in sidebar navigation links.                                                                                                                          |
| .../pay/PayAnalytics/PayAnalytics.tsx, .../PayEmbedFTUX.tsx, .../code-examples.tsx                     | Refactored Pay FTUX to accept code examples as props; extracted code example generators into a new file.                                                                                          |
| .../shared/FileInput.tsx, .../core-ui/batch-upload/batch-table.tsx                                     | Updated import paths for FilePreview component to match new tokens structure.                                                                                                                     |
| .../components/contract-components/*                                                                   | Updated UI text from "asset" to "token" in import and table components.                                                                                                                           |
| .../components/embedded-wallets/Users/index.tsx                                                        | Removed trackingCategory prop from InAppWalletUsersPageContent.                                                                                                                                   |
| .../components/smart-wallets/AccountAbstractionAnalytics/index.tsx                                     | Updated import paths to use absolute imports.                                                                                                                                                     |
| .../dashboard/StepsCard.tsx                                                                            | Minor styling change: removed large font size on title.                                                                                                                                           |
| .../service-utils/src/core/services.ts                                                                 | Updated service titles: "In-App Wallets" → "Wallets", "Engine Cloud" → "Transactions".                                                                                                           |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant Sidebar
    participant ProjectSidebarLayout
    participant AppRouter

    User->>Sidebar: Clicks navigation link
    Sidebar->>ProjectSidebarLayout: Passes link info (with isActive, engineLinkType, etc.)
    ProjectSidebarLayout->>AppRouter: Determines route based on engineLinkType and link
    AppRouter-->>User: Navigates to new project section (e.g., /transactions, /wallets, /tokens)

Assessment against linked issues

Objective Addressed Explanation
Update dashboard product grouping/navigation in project page (TOOL-4842)
Rename sidebar links and sections as per new grouping (TOOL-4842)
Remove/replace Nebula product and related navigation (TOOL-4842)
Update routes, labels, and UI to match new product groupings (TOOL-4842)

Assessment against linked issues: Out-of-scope changes

Code Change Explanation
None found

Possibly related PRs

Suggested labels

Playground, Portal

Suggested reviewers

  • MananTank

<!-- walkthrough_end -->

<!-- This is an auto-generated comment: resource warnings by coderabbit.ai -->

> [!WARNING]
> ## Review ran into problems
> 
> <details>
> <summary>🔥 Problems</summary>
> 
> Errors were encountered while retrieving linked issues.
> 
> <details>
> <summary>Errors (1)</summary>
> 
> * TEAM-0000: Entity not found: Issue - Could not find referenced Issue.
> 
> </details>
> 
> </details>

<!-- end of auto-generated comment: resource warnings by coderabbit.ai -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=thirdweb-dev/js&utm_content=7395):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@github-actions github-actions bot added Dashboard Involves changes to the Dashboard. packages labels Jun 20, 2025
@graphite-app
Copy link
Contributor

graphite-app bot commented Jun 20, 2025

How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • merge-queue - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

@codecov
Copy link

codecov bot commented Jun 20, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 52.06%. Comparing base (9667c74) to head (eeb672d).
Report is 1 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #7395   +/-   ##
=======================================
  Coverage   52.06%   52.06%           
=======================================
  Files         945      945           
  Lines       63565    63565           
  Branches     4208     4208           
=======================================
  Hits        33098    33098           
  Misses      30361    30361           
  Partials      106      106           
Flag Coverage Δ
packages 52.06% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions
Copy link
Contributor

github-actions bot commented Jun 20, 2025

size-limit report 📦

Path Size Loading time (3g) Running time (snapdragon) Total time
thirdweb (esm) 62.56 KB (0%) 1.3 s (0%) 392 ms (+63.45% 🔺) 1.7 s
thirdweb (cjs) 350.74 KB (0%) 7.1 s (0%) 1.9 s (-0.39% 🔽) 8.9 s
thirdweb (minimal + tree-shaking) 5.72 KB (0%) 115 ms (0%) 188 ms (+1523.75% 🔺) 302 ms
thirdweb/chains (tree-shaking) 530 B (0%) 11 ms (0%) 104 ms (+1068.71% 🔺) 114 ms
thirdweb/react (minimal + tree-shaking) 19.61 KB (0%) 393 ms (0%) 221 ms (+548.65% 🔺) 613 ms

@vercel vercel bot temporarily deployed to Preview – docs-v2 June 20, 2025 19:59 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui June 20, 2025 19:59 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula June 20, 2025 19:59 Inactive
@vercel vercel bot temporarily deployed to Preview – login June 20, 2025 19:59 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground June 20, 2025 19:59 Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (8)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/layout.tsx (1)

28-63: Consider updating component names for consistency.

While the URL paths have been updated to use "wallets" terminology, the components InAppWalletsHeader and InAppWalletsFooter still reference the old "InAppWallets" naming. Consider updating these component names to match the new simplified terminology.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/cards.tsx (1)

4-7: Consider updating analytics function names for consistency.

The analytics functions still use "Asset" terminology (reportAssetCreationStarted, reportAssetImportStarted, reportAssetImportSuccessful) which is inconsistent with the new "tokens" terminology. Consider updating these function names or their internal tracking categories.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/try-it-out.tsx (1)

31-31: Consider avoiding !important in className.

Using !text-sm with !important suggests there might be specificity issues. Consider addressing the underlying CSS specificity problem rather than using !important.

-          tabClassName="!text-sm"
+          tabClassName="text-sm"

If the !important is necessary due to conflicting styles in the TabButtons component, consider updating the component's CSS instead.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/contract-webhooks/contract-webhooks-page.tsx (2)

84-88: Consider extracting CreateContractWebhookButton to improve consistency.

The create webhook button appears in the empty state but not when webhooks exist. Consider adding it to the table view as well or extracting it to a shared location for consistent UX.

Consider adding the create button to the table view for consistency:

        <ContractsWebhooksTable
          webhooks={webhooks}
          projectClientId={projectClientId}
          client={client}
          supportedChainIds={supportedChainIds}
        />
+        <div className="mt-4">
+          <CreateContractWebhookButton
+            client={client}
+            projectClientId={projectClientId}
+            supportedChainIds={supportedChainIds}
+          />
+        </div>

22-28: Improve error handling specificity.

The error handling could be more specific about which operation failed, helping users understand whether it's a webhook fetch issue or a supported chains fetch issue.

    const webhooksRes = await getWebhooks(projectClientId);
    if (webhooksRes.error) {
-      errorMessage = webhooksRes.error;
+      errorMessage = `Failed to load webhooks: ${webhooksRes.error}`;
    } else if (webhooksRes.data) {
      webhooks = webhooksRes.data;
    }
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/layout.tsx (1)

22-24: Consider using the loginRedirect pattern consistently.

The authentication check uses a different pattern than what's shown in the webhook component. Consider using the loginRedirect function for consistency.

Based on the webhook component pattern, consider:

  if (!authToken) {
-    loginRedirect(`/team/${params.team_slug}/${params.project_slug}/contracts`);
+    return loginRedirect(`/team/${params.team_slug}/${params.project_slug}/contracts`);
  }
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx (2)

136-146: Consider adding error handling for getEngineInstances call.

The getEngineInstances call could fail, but the error case isn't explicitly handled. Consider adding error handling to ensure the component doesn't break.

  if (!engineCloudToken) {
-    const engineInstances = await getEngineInstances({
-      authToken: params.authToken,
-      teamIdOrSlug: params.project.teamId,
-    });
-
-    // if we have any legacy engine instances, link to the legacy engine page
-    if (engineInstances.data && engineInstances.data.length > 0) {
-      engineLinkType = "dedicated";
-    }
+    try {
+      const engineInstances = await getEngineInstances({
+        authToken: params.authToken,
+        teamIdOrSlug: params.project.teamId,
+      });
+
+      // if we have any legacy engine instances, link to the legacy engine page
+      if (engineInstances.data && engineInstances.data.length > 0) {
+        engineLinkType = "dedicated";
+      }
+    } catch (error) {
+      console.warn("Failed to fetch engine instances, defaulting to cloud", error);
+      // engineLinkType remains "cloud"
+    }
  }

63-66: Verify performance impact of additional async call.

The getEngineLinkType call adds another async operation to the layout loading. Consider if this data could be cached or computed at build time for better performance.

Consider caching the engine link type result or computing it less frequently to improve page load performance, especially if this layout is rendered frequently.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9c420c0 and c5fa3b1.

📒 Files selected for processing (89)
  • apps/dashboard/redirects.js (2 hunks)
  • apps/dashboard/src/@/analytics/report.ts (3 hunks)
  • apps/dashboard/src/@/components/blocks/Sidebar.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/SidebarLayout.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/UpsellBannerCard.stories.tsx (0 hunks)
  • apps/dashboard/src/@/components/blocks/UpsellBannerCard.tsx (0 hunks)
  • apps/dashboard/src/@/components/ui/NavLink.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/primary-dashboard-button.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/ContractOverviewPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/contracts/DeployedContractsPageHeader.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/account/contracts/_components/DeployedContractsPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/AAFooterSection.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/AccountAbstractionPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/factories/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/settings/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/in-app-wallets/_constants.ts (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/webhooks/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/key-management.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/layout.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/overview/components/engine-overview.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/page.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx (5 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/fetch-nebula-analytics.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/nebula-analytics-filter.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/nebula-analytics-page.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/nebula-analytics-ui.stories.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/nebula-analytics-ui.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/utils.ts (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/layout.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/nebula-ftux.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/page.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/cards.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/_common/PageHeader.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/nft/create-nft-page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/nft/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/nft/sales/sales-settings.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/token/create-token-page-impl.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/token/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/page.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/ftux.client.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/send-test-tx.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-chart/tx-chart-ui.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-table/tx-table-ui.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/utils.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/layout.tsx (4 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/analytics.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/create-server-wallet.client.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/try-it-out.tsx (5 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/wallet-table/wallet-table-ui.client.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/layout.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/page.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/create-vault-account.client.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/key-management.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/list-access-tokens.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/rotate-admin-key.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/_components/footer.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/_components/header.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/analytics/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/settings/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/CreateWebhookModal.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/WebhooksTable.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/contract-webhooks/contract-webhooks-page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx (2 hunks)
  • apps/dashboard/src/components/contract-components/import-contract/modal.tsx (1 hunks)
  • apps/dashboard/src/components/contract-components/tables/contract-table.tsx (2 hunks)
  • apps/dashboard/src/components/dashboard/StepsCard.tsx (1 hunks)
  • apps/dashboard/src/components/embedded-wallets/Users/index.tsx (0 hunks)
  • apps/dashboard/src/components/shared/FileInput.tsx (1 hunks)
  • apps/dashboard/src/components/smart-wallets/AccountAbstractionAnalytics/index.tsx (1 hunks)
  • apps/dashboard/src/core-ui/batch-upload/batch-table.tsx (1 hunks)
  • apps/dashboard/src/lib/time.ts (0 hunks)
  • packages/service-utils/src/core/services.ts (2 hunks)
💤 Files with no reviewable changes (17)
  • apps/dashboard/src/@/components/blocks/UpsellBannerCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx
  • apps/dashboard/src/@/components/blocks/UpsellBannerCard.stories.tsx
  • apps/dashboard/src/components/embedded-wallets/Users/index.tsx
  • apps/dashboard/src/lib/time.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/in-app-wallets/_constants.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/utils.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/nebula-analytics-filter.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/key-management.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/nebula-analytics-ui.stories.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/nebula-ftux.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/nebula-analytics-ui.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/nebula-analytics-page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/nebula/components/analytics/fetch-nebula-analytics.tsx
🧰 Additional context used
🧠 Learnings (1)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/webhooks/page.tsx (1)
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
🧬 Code Graph Analysis (11)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/try-it-out.tsx (1)
apps/dashboard/src/@/components/ui/tabs.tsx (1)
  • TabButtons (85-159)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/ftux.client.tsx (1)
apps/dashboard/src/components/dashboard/StepsCard.tsx (1)
  • StepsCard (22-108)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx (1)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/contract-webhooks/contract-webhooks-page.tsx (1)
  • ContractsWebhooksPageContent (11-93)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/layout.tsx (1)
apps/dashboard/src/@/components/ui/tabs.tsx (1)
  • TabPathLinks (213-244)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/layout.tsx (1)
apps/dashboard/src/tw-components/link.tsx (1)
  • Link (33-56)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/webhooks/page.tsx (3)
apps/dashboard/src/@/api/team.ts (1)
  • getTeamBySlug (13-32)
apps/dashboard/src/@/api/projects.ts (1)
  • getProject (29-48)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/contract-webhooks/contract-webhooks-page.tsx (1)
  • ContractsWebhooksPageContent (11-93)
apps/dashboard/src/app/(app)/account/contracts/_components/DeployedContractsPage.tsx (1)
apps/dashboard/src/app/(app)/account/contracts/_components/DeployViaCLIOrImportCard.tsx (1)
  • DeployViaCLIOrImportCard (11-68)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx (1)
apps/portal/src/icons/products/InsightIcon.tsx (1)
  • InsightIcon (1-21)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/layout.tsx (6)
apps/dashboard/src/app/(app)/api/lib/getAuthToken.ts (1)
  • getAuthToken (6-14)
apps/dashboard/src/@/api/team.ts (1)
  • getTeamBySlug (13-32)
apps/dashboard/src/@/api/projects.ts (1)
  • getProject (29-48)
apps/dashboard/src/@/constants/thirdweb-client.client.ts (1)
  • getClientThirdwebClient (3-11)
apps/dashboard/src/app/(app)/account/contracts/DeployedContractsPageHeader.tsx (1)
  • DeployedContractsPageHeader (11-62)
apps/dashboard/src/@/components/ui/tabs.tsx (1)
  • TabPathLinks (213-244)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx (3)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx (1)
  • ProjectSidebarLayout (20-123)
apps/dashboard/src/@/api/projects.ts (1)
  • Project (6-6)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/_utils/getEngineInstances.ts (1)
  • getEngineInstances (4-33)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx (1)
apps/portal/src/icons/products/InsightIcon.tsx (1)
  • InsightIcon (1-21)
⏰ Context from checks skipped due to timeout of 90000ms (7)
  • GitHub Check: Unit Tests
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Build Packages
  • GitHub Check: Size
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (123)
packages/service-utils/src/core/services.ts (2)

42-42: Updated ‘embeddedWallets’ title to ‘Wallets’ aligns with navigation rename.

This change correctly reflects the new UI label for in-app wallets across the dashboard.


79-79: Updated ‘engineCloud’ title to ‘Transactions’ to match new terminology.

This aligns the core service titles with the updated sidebar and routing labels.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/_components/footer.tsx (1)

1-1: Import Path Adjustment Approved

The FooterLinksSection import path has been correctly updated to the new relative location. This matches the restructuring in related modules.

apps/dashboard/src/components/dashboard/StepsCard.tsx (1)

40-42: Verify responsive heading size

The removal of lg:text-2xl changes the heading size on large screens. Please confirm with the design team that this update matches the intended typography.

apps/dashboard/src/components/smart-wallets/AccountAbstractionAnalytics/index.tsx (1)

2-3: Standardize imports to the @app alias

The SponsoredTransactionsTable and searchParams imports have been updated to use the @app alias. Ensure these paths resolve correctly and align with the project's alias configuration.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/settings/page.tsx (1)

7-8: Switch to absolute @app imports

The getAuthToken and getValidTeamPlan imports have been standardized to use the @app alias. Verify that the path aliases are configured correctly and that these imports resolve.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/_components/header.tsx (1)

7-7: Update header text for feature rename

The heading text has been simplified from "In-App Wallets" to "Wallets", aligning with the new naming convention.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/page.tsx (1)

2-2: Consistent absolute import for getAuthToken.
Importing getAuthToken via the @app/api alias aligns with the project-wide convention of absolute imports. Ensure that path aliases in tsconfig.json are configured accordingly and that there are no lingering relative imports.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/rotate-admin-key.client.tsx (1)

30-34: Update vault client utilities import path.
The utilities in vault.client have been relocated under transactions/lib. Confirm that createManagementAccessToken, createWalletAccessToken, initVaultClient, and maskSecret are correctly exported from the new path and that related imports in sibling components reflect this change.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/page.tsx (1)

4-4: Standardize getAuthToken import alias.
Changing to the @app/api alias for getAuthToken ensures consistency across the codebase. Verify that this alias is properly recognized by your module resolver and remove any outdated relative imports.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/page.tsx (1)

4-4: Adopt absolute import for getAuthToken.
Aligning getAuthToken import with the @app/api alias is consistent with other modules. Double-check that tsconfig path mappings cover this alias and no failed imports result.

apps/dashboard/src/components/shared/FileInput.tsx (1)

3-3: Update FilePreview import path to reflect tokens rename.
Switching from the assets to tokens directory in the path matches the broader terminology shift. Ensure that the alias @app/team/.../tokens/create/_common/file-preview resolves correctly and that there are no broken references.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/list-access-tokens.client.tsx (1)

23-23: Imports migrated to transactions module
The vault utilities are now centralized under transactions/lib. This path update aligns with the new folder structure.

apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/primary-dashboard-button.tsx (1)

90-90: Consistent terminology: "View Token Page"
The button label was updated to use "Token" instead of "Asset," matching the new naming convention across the dashboard.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/page.tsx (1)

4-6: Switched to @app alias for imports
Using absolute @app paths for DeployedContractsPage, getAuthToken, and loginRedirect ensures consistent module resolution.

apps/dashboard/src/components/contract-components/import-contract/modal.tsx (1)

61-61: Dialog title updated to "Import Token"
Terminology changed from "Asset" to "Token" for non-contract imports, aligning with the overall rename.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/nft/page.tsx (1)

28-28: Redirect route corrected to /tokens/create/nft
Unauthenticated users are now sent to the updated tokens creation path instead of the old assets route.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/page.tsx (1)

5-5: LGTM: Import path standardization

Good improvement switching from a relative import to an absolute import using the @app alias. This enhances maintainability and consistency across the codebase.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/nft/create-nft-page.tsx (1)

340-340: Path migration from "assets" to "tokens" looks correct

This change aligns with the broader refactoring effort. Ensure the target route /tokens exists and is properly configured to receive the revalidation.

#!/bin/bash
# Verify that the tokens route exists
fd -t f "page.tsx" | rg "tokens.*page\.tsx$" | head -5
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/analytics/page.tsx (1)

13-13: URL simplification looks appropriate

The redirect from the legacy "/connect/in-app-wallets" path to the simplified "/wallets" path is consistent with the navigation restructuring effort.

#!/bin/bash
# Verify the target wallets route exists
fd -t f "page.tsx" | rg "wallets.*page\.tsx$" | head -3
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/AAFooterSection.tsx (1)

1-1: Import path adjustment due to directory restructuring

The import path has been updated to reflect the new directory structure. Verify that the FooterLinksSection component exists at the new relative path.

#!/bin/bash
# Verify the FooterLinksSection component exists at the expected path
fd -t f "FooterLinksSection" | head -3
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/layout.tsx (1)

15-15: Navigation path updated correctly for transactions migration

The link change from "/engine/cloud" to "/transactions" aligns perfectly with the broader migration effort and matches the "Back to Transactions" text.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/settings/page.tsx (2)

5-7: LGTM: Clean import path refactoring

The change from relative to absolute imports improves maintainability and consistency across the codebase.


24-24: It looks like rg --type tsx isn’t picking up any results—let’s drop the file-type filters and search everything for “wallets/settings” to see if there are other redirects or route references we’re missing:

#!/bin/bash
# Search for any occurrence of "wallets/settings" across all files
echo "Scanning for wallets/settings routes..."
rg -A3 -B3 "wallets/settings"
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/token/create-token-page-impl.tsx (1)

341-341: LGTM: Path update aligns with assets-to-tokens migration

The revalidation path change from /assets to /tokens is correct and consistent with the broader terminology migration.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/page.tsx (3)

5-6: LGTM: Import path standardization

Converting to absolute imports improves code maintainability and consistency.


27-27: LGTM: URL simplification aligns with migration

Removing the /connect segment from the redirect URL is consistent with the broader navigation simplification effort.


66-66: Verify styling change doesn't break layout

The p-5 padding class was removed from the outer div. Please ensure this doesn't negatively impact the visual layout or spacing.

apps/dashboard/src/@/components/blocks/Sidebar.tsx (1)

12-12: LGTM: Enhanced sidebar link flexibility

The optional isActive property allows for custom active state determination, providing more flexibility for complex navigation scenarios while maintaining backward compatibility.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/_common/PageHeader.tsx (1)

27-29: LGTM: Breadcrumb navigation updated for tokens migration

The path and text changes from "assets" to "tokens" correctly align with the broader migration effort and ensure consistent navigation terminology.

apps/dashboard/src/core-ui/batch-upload/batch-table.tsx (1)

3-3: Verify the new import path exists after the assets → tokens migration.

The import has been updated to use an absolute path and reflect the terminology change from "assets" to "tokens". Ensure the FilePreview component exists at the new location.

#!/bin/bash
# Description: Verify the FilePreview component exists at the new path
# Expected: File should exist at the new tokens path

fd "file-preview" --type f --extension tsx --extension ts | grep -E "(tokens|assets)" | head -10
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/page.tsx (2)

3-4: LGTM: Import paths standardized to absolute imports.

The imports have been correctly updated to use absolute paths with the @app alias, improving consistency and maintainability.


22-22: LGTM: Redirect URL updated to match new transactions routing.

The redirect URL has been correctly updated from /engine/cloud/tx/ to /transactions/tx/ to align with the new routing structure. This ensures proper navigation after authentication.

apps/dashboard/src/components/contract-components/tables/contract-table.tsx (2)

167-167: LGTM: Table header updated to reflect tokens terminology.

The table header has been correctly updated from "Asset Page" to "Token Page" to align with the new terminology.


266-266: LGTM: Empty state message updated for consistency.

The empty state message has been correctly updated from "No assets found" to "No tokens found" to maintain consistency with the new terminology.

apps/dashboard/src/@/components/blocks/SidebarLayout.tsx (1)

126-126: LGTM: Enhanced NavLink with custom active state support.

The addition of the isActive prop enables custom active state logic for sidebar links, providing more flexibility for dynamic navigation states. This aligns with the broader sidebar navigation improvements.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-table/tx-table-ui.tsx (1)

141-141: LGTM: Navigation URL updated to match new transactions routing.

The router push URL has been correctly updated from /engine/cloud/tx/ to /transactions/tx/ to align with the new routing structure, maintaining consistency throughout the application.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/send-test-tx.client.tsx (1)

264-267: LGTM! Navigation URL updated correctly.

The router navigation has been properly updated from the legacy /engine/cloud path to the new /transactions path, maintaining the same conditional logic while aligning with the broader dashboard terminology migration.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/nft/sales/sales-settings.tsx (1)

40-40: LGTM! Terminology updated consistently.

The UI text has been properly updated from "assets" to "tokens" across all relevant descriptions for primary sales and royalties, maintaining consistency with the broader dashboard terminology migration.

Also applies to: 63-63, 75-75

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/analytics.ts (1)

2-3: LGTM! Import paths standardized.

The imports have been properly updated to use absolute paths with the @app alias and standardized module paths, improving maintainability and consistency across the codebase.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/page.tsx (2)

4-5: LGTM! Import paths standardized.

The imports have been properly updated to use the @app alias for better maintainability and consistency.


33-33: LGTM! URL structure simplified.

The redirect URL has been correctly updated to remove the /connect segment, simplifying the navigation structure while maintaining the same redirect functionality.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/utils.ts (1)

9-11: LGTM! Added proper localStorage guard.

The addition of a localStorage availability check prevents runtime errors in non-browser environments (such as during SSR) while maintaining the existing function contract by returning null when unavailable.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/AccountAbstractionPage.tsx (1)

20-20: LGTM! URL path simplification looks good.

The removal of the /connect segment aligns with the broader dashboard navigation refactoring effort described in the AI summary.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/overview/components/engine-overview.tsx (1)

144-145: LGTM! UI and functionality improvements look good.

The popover width reduction and addition of the disableChainId prop both appear to be meaningful improvements to the component's usability and functionality.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/page.tsx (2)

3-4: LGTM! Import path improvements look good.

The change to absolute imports improves maintainability and follows good practices.


19-19: LGTM! URL path simplification is consistent with the refactoring.

The removal of /connect/in-app-wallets and simplification to /wallets aligns with the broader dashboard navigation refactoring effort.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-chart/tx-chart-ui.tsx (1)

188-188: LGTM! URL path simplification is consistent with the refactoring.

The removal of /engine/cloud segment and direct navigation to /vault aligns with the broader dashboard navigation refactoring effort to simplify URL structures.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx (1)

442-442: LGTM! URL path simplification is consistent with the refactoring.

The removal of /connect segment from the universal-bridge settings path aligns with the broader dashboard navigation refactoring effort to simplify URL structures.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/layout.tsx (1)

36-46: LGTM! URL paths updated correctly.

The navigation links have been properly updated to use the simplified /wallets path structure, removing the /connect segment as intended.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/cards.tsx (3)

43-55: LGTM! URL paths updated correctly.

The navigation links have been properly updated from /assets/create/ to /tokens/create/ as part of the terminology migration.


65-66: LGTM! UI text updated correctly.

The card title and description have been properly updated to use "tokens" terminology instead of "assets".


34-34: Consider updating modal type for consistency.

The ImportModal component is still using type="asset" which may be inconsistent with the new "tokens" terminology. Verify if this type should be updated to match the new naming convention.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/factories/page.tsx (3)

9-11: LGTM! Import paths updated to absolute imports.

The import paths have been properly updated from relative to absolute paths using the @app/ alias, which improves maintainability and consistency.


34-34: LGTM! Redirect URL updated correctly.

The redirect URL has been properly updated to remove the /connect segment, simplifying the path structure as intended.


9-11: ```shell
#!/bin/bash
echo "1. Looking for jsconfig.json files at project root and in apps/dashboard:"
find . -maxdepth 3 -type f -name "jsconfig.json" -print

echo -e "\n2. Inspecting jsconfig.json for '@app' path mappings:"
for js in $(find . -maxdepth 3 -type f -name "jsconfig.json"); do
echo "--- $js ---"
grep -n ""@app" -C2 "$js" || echo "No '@app' paths in $js"
done

echo -e "\n3. Searching apps/dashboard for Next.js config and webpack aliases:"
next_cfg=$(find apps/dashboard -maxdepth 2 -type f -name "next.config.*")
if [ -n "$next_cfg" ]; then
echo "--- Found Next.js config: $next_cfg ---"
grep -n "alias" -C2 "$next_cfg" || echo "No webpack alias in $next_cfg"
else
echo "No Next.js config found in apps/dashboard"
fi


</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/create/token/page.tsx (2)</summary>

`7-9`: **LGTM! Import paths updated to absolute imports.**

The import paths have been properly updated from relative to absolute paths using the `@app/` alias, which improves maintainability and consistency.

---

`27-27`: **LGTM! Redirect URL updated correctly.**

The redirect URL has been properly updated from `/assets/create/token` to `/tokens/create/token` as part of the terminology migration from "assets" to "tokens".

</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/create-server-wallet.client.tsx (3)</summary>

`89-89`: **LGTM! Redirect URL updated correctly.**

The redirect URL has been properly updated from `/engine/cloud/vault` to `/vault`, simplifying the path structure as part of the broader refactoring.

---

`107-107`: **LGTM! Navigation URL updated correctly.**

The navigation URL has been properly updated from `/engine/cloud/vault` to `/vault`, maintaining consistency with the redirect logic above.

---

`89-107`: I couldn’t locate any `/vault` routes in the dashboard app—let’s narrow the search to the `apps/dashboard/src/app` tree:


```shell
#!/bin/bash
# 1. List any “vault” directories under the app folder
fd -t d vault apps/dashboard/src/app || true

# 2. Look for Next.js page files inside those vault dirs
fd -e tsx -e ts apps/dashboard/src/app -x bash -lc 'if [[ "{}" == *"/vault/"* ]]; then echo {}; fi' | xargs -r rg -Hn "export default"

# 3. Specifically find any page.tsx under a vault path
find apps/dashboard/src/app -type f -path "*/vault/*" -name "page.tsx" -print || true
apps/dashboard/src/@/analytics/report.ts (1)

13-13: Documentation updated correctly for terminology migration.

The comment updates from "asset page" to "token page" correctly reflect the UI terminology migration while preserving the actual analytics functionality. This maintains backward compatibility for existing analytics data while documenting the new user-facing terminology.

Also applies to: 233-233, 253-253

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/ftux.client.tsx (2)

111-111: Terminology update aligns with migration goals.

The title change from "Setup Your Engine" to "Get Started with Transactions" correctly reflects the broader dashboard migration from Engine to Transactions terminology.


8-8: Verify the updated import path is correct.

The import path was updated from "../vault/components/create-vault-account.client" to "../../vault/components/create-vault-account.client", suggesting a directory restructuring. Please ensure this path resolves correctly.

#!/bin/bash
# Description: Verify the import path for CreateVaultAccountButton exists at the new location

# Check if the file exists at the new path relative to this file's directory
fd -t f "create-vault-account.client" --full-path | head -10

# Also search for any exports of CreateVaultAccountButton to verify component location
ast-grep --pattern 'export $_ CreateVaultAccountButton'
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/tokens/page.tsx (1)

27-27: Terminology migration implemented consistently.

The systematic updates from "assets" to "tokens" throughout the component correctly implement the dashboard migration goals. The redirect URL, headings, and descriptive text have all been updated consistently to reflect the new terminology.

Also applies to: 56-58, 82-82

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/layout.tsx (2)

21-21: URL path simplification improves navigation structure.

The removal of the /connect segment from the URL path (/team/{team_slug}/{project_slug}/universal-bridge) simplifies the routing structure and aligns with the broader navigation improvements mentioned in the PR.


5-5: ```shell
#!/bin/bash

Verify named export of FooterLinksSection in the component file

FILE=$(fd -t f FooterLinksSection --full-path)
rg -n "^export " "$FILE"


</details>
<details>
<summary>apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/ContractOverviewPage.tsx (1)</summary>

`48-51`: **Terminology migration completed correctly for UpsellBannerCard.**

The text updates from "asset" to "token" in the title, description, and CTA button correctly implement the dashboard-wide terminology migration. The functionality remains unchanged while improving consistency with the new token-focused terminology.

</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/CreateWebhookModal.tsx (2)</summary>

`48-52`: **Component renamed and interface unchanged - good refactoring.**

The component rename from `CreateWebhookModal` to `CreateContractWebhookButton` better reflects its specific purpose for contract webhooks. The interface remains the same, maintaining backward compatibility.

---

`227-230`: **Button styling improvements enhance UX.**

The addition of the PlusIcon, smaller size, and updated text from "New Webhook" to "Create Webhook" creates a more polished and intuitive user interface.

</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/try-it-out.tsx (1)</summary>

`69-69`: **Improved content organization and spacing.**

The updated spacing and wrapped sections for installation and usage examples create better visual separation and improve readability.



Also applies to: 119-138

</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/create-vault-account.client.tsx (3)</summary>

`18-23`: **Import path reorganization aligns with transactions restructuring.**

The updated import paths from vault-specific directories to the transactions module structure are consistent with the broader refactoring mentioned in the PR summary.



Also applies to: 32-32

---

`159-159`: **Icon change from LockIcon to UserLockIcon.**

The icon change appears intentional but verify this aligns with the design requirements for vault account creation.

---

`34-37`: **Verify component export change doesn't break imports.**

The component export was changed from default to named export. Ensure all files importing this component have been updated accordingly.


```shell
#!/bin/bash
# Description: Check for imports of CreateVaultAccountButton to ensure they use named imports
# Expected: All imports should use named import syntax

rg -A 2 -B 2 "import.*CreateVaultAccountButton|import.*create-vault-account"
apps/dashboard/src/@/components/ui/NavLink.tsx (2)

14-14: Excellent addition of flexible active state logic.

The optional isActive prop allows consumers to provide custom logic for determining active states, which enhances the component's flexibility while maintaining backward compatibility.


19-25: Proper implementation with fallback logic.

The active state calculation correctly prioritizes the custom isActive function when provided, falling back to the existing pathname-based logic. The ternary chain is clear and maintains all existing functionality.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx (3)

220-222: URL path simplification aligns with navigation restructuring.

Removing the /connect prefix from the account abstraction, wallets, and universal bridge settings URLs is consistent with the broader dashboard navigation changes mentioned in the PR summary.


764-764: Visual styling improvement with dashed border.

The change from solid to dashed border provides better visual distinction for the service configuration sections.


783-783: Enhanced Configure button styling.

The updated button styling with rounded background and adjusted padding improves the visual hierarchy and user experience.

apps/dashboard/src/app/(app)/account/contracts/DeployedContractsPageHeader.tsx (4)

19-19: UI refinement looks good.

Removing the bottom border aligns with the updated design patterns across the dashboard.


31-31: Padding adjustment improves spacing.

The reduced bottom padding (from pb-10 to pb-5) creates better visual balance with the new description text.


36-38: Clear and helpful description added.

The descriptive text provides useful context for users about the contracts functionality.


42-52: Button styling improvements enhance consistency.

The changes to button sizing (size="sm"), gap adjustments, and icon coloring create a more cohesive UI that aligns with the design system.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/layout.tsx (3)

28-33: Terminology update aligns with navigation changes.

The header title change from "Engine" to "Transactions" and badge update to "Dedicated Engine" are consistent with the broader navigation refactoring.


55-69: Cleaner TabPathLinks implementation.

The simplified structure using scrollableClassName prop removes unnecessary wrapper divs and improves maintainability.


98-98: Route update follows new navigation pattern.

The URL change from /engine/cloud to /transactions aligns with the systematic routing updates across the dashboard.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx (2)

3-3: Import path standardization.

Using absolute import for getAuthToken maintains consistency with the codebase's import conventions.


46-46: Clean separation of concerns.

Delegating webhook functionality to ContractsWebhooksPageContent improves modularity and makes the page component focused solely on layout and authentication.

apps/dashboard/src/app/(app)/account/contracts/_components/DeployedContractsPage.tsx (1)

18-28: Improved component structure and layout.

The refactoring achieves several improvements:

  • Adding container max-w-7xl provides consistent width constraints
  • Simplified Suspense boundary reduces unnecessary nesting
  • Dedicated spacing div makes layout intentions clearer
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/wallet-table/wallet-table-ui.client.tsx (4)

92-92: Table border refinement.

Removing the bottom border (border-b-0) creates a cleaner transition to the pagination section.


141-196: Well-implemented pagination with proper UX considerations.

The pagination implementation includes:

  • Conditional rendering only when needed (totalPages > 1)
  • Clear visual separation with border and padding
  • Proper disabled states for previous/next buttons
  • Accessible navigation with Link components

150-151: Route updates align with navigation refactoring.

All pagination links correctly updated from /engine/cloud/server-wallets to /transactions/server-wallets path.

Also applies to: 167-167, 179-180


266-266: SendTestTransaction route properly updated.

The button navigation correctly uses the new /transactions path while preserving the query parameter.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/layout.tsx (4)

25-26: LGTM! Improved variable naming.

The variable names projectLayoutPath and layoutPath are more descriptive and align well with the refactoring from Engine to Transactions terminology.


37-37: LGTM! Consistent terminology update.

The header change from "Engine Cloud" to "Transactions" aligns with the overall navigation refactoring.


56-56: LGTM! Consistent path variable usage.

The link correctly uses the new projectLayoutPath variable for consistency.


70-80: LGTM! Navigation links updated consistently.

All navigation links correctly use the new layoutPath variable, maintaining consistency across the component.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/layout.tsx (1)

3-33: LGTM! Well-structured layout component.

The VaultLayout component follows good practices:

  • Clean, semantic structure with proper spacing
  • External link includes security attributes (target="_blank", rel="noopener noreferrer")
  • Consistent styling patterns with other layout components
  • Clear information hierarchy with title and descriptive text
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/webhooks/page.tsx (4)

11-11: LGTM! Correct params handling.

Properly awaiting the params object aligns with Next.js server component best practices.


13-17: LGTM! Efficient parallel data fetching.

Using Promise.all to fetch authentication token, team, and project data in parallel is an efficient approach that reduces overall loading time.


19-31: LGTM! Proper authentication and authorization handling.

The component correctly handles authentication and authorization:

  • Redirects unauthenticated users to login
  • Redirects to appropriate fallback pages when team or project is not found
  • Uses proper redirect URLs for context preservation

34-36: LGTM! Clean component structure.

The rendered component structure is clean and passes the required props correctly to the ContractsWebhooksPageContent component.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/WebhooksTable.tsx (3)

21-21: LGTM! Consistent import update.

The import change from CreateWebhookModal to CreateContractWebhookButton aligns with the component refactoring to focus on contract-specific webhooks.


40-40: LGTM! Clear component naming.

Renaming to ContractsWebhooksTable makes the component's purpose more explicit and aligns with the contract-focused refactoring.


219-235: LGTM! Improved UI layout structure.

The restructured layout with:

  • Container with border and rounded corners
  • Table with removed border styling to avoid double borders
  • Footer section with create button
    provides a cleaner, more organized appearance.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/key-management.tsx (2)

9-46: LGTM! Well-structured key management component.

The KeyManagement component implements clean conditional rendering:

  • Clear separation between account creation and key management states
  • Proper component composition with reusable sub-components
  • Consistent styling and spacing throughout

48-86: LGTM! Informative user onboarding experience.

The CreateVaultAccountAlert component provides excellent UX:

  • Clear explanation of Vault functionality with bulleted benefits
  • External documentation link with proper security attributes
  • Well-structured information hierarchy guiding users to next steps
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx (3)

12-12: LGTM! Icon imports properly updated.

The icon imports have been correctly updated to reflect the product name changes - ArrowLeftRightIcon for Transactions and PayIcon for Universal Bridge.

Also applies to: 20-20


259-264: LGTM! Product description accurately reflects Universal Bridge functionality.

The updated description for Universal Bridge correctly describes its cross-chain functionality for bridging, swapping, and purchasing cryptocurrencies.


238-243: ```shell
#!/usr/bin/env bash
set -e

1. Search for any route file or directory matching "transactions" under the dashboard app folder

echo "🔍 Locating 'transactions' files/directories under apps/dashboard/src/app…"
fd -HI -g "transactions" apps/dashboard/src/app || echo "⚠️ No 'transactions' files or folders found under apps/dashboard/src/app."

2. If there’s a Next.js config in apps/dashboard, inspect its redirects block

if [ -f apps/dashboard/next.config.js ]; then
echo -e "\n🔍 Inspecting redirects() in apps/dashboard/next.config.js…"
awk '/redirects/,/]/' apps/dashboard/next.config.js || echo "⚠️ No redirects() export found in apps/dashboard/next.config.js."
else
echo -e "\n⚠️ apps/dashboard/next.config.js not found."
fi


</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/layout.tsx (2)</summary>

`16-20`: **LGTM! Efficient concurrent data fetching.**

Using `Promise.all` for concurrent fetching of authentication token, team, and project data is an excellent performance optimization that reduces the overall load time.

---

`48-61`: **LGTM! Tab navigation implementation follows best practices.**

The tab navigation using `TabPathLinks` with exact matching for the main contracts page and prefix matching for webhooks is correctly implemented and follows the patterns from the relevant code snippets.

</details>
<details>
<summary>apps/dashboard/redirects.js (3)</summary>

`65-66`: **LGTM! Good abstraction for maintainability.**

Extracting the common project route pattern into a constant improves maintainability and reduces the risk of typos in redirect rules.

---

`104-107`: **Consider if nebula redirect should go to universal-bridge instead.**

The nebula redirect goes to the project root instead of `/universal-bridge`. Based on the AI summary mentioning "Nebula" → "Universal Bridge", this might be incorrect.



Should the nebula redirect go to universal-bridge instead of the project root?

```diff
    source: `${projectRoute}/nebula/:path*`,
-    destination: projectRoute,
+    destination: `${projectRoute}/universal-bridge/:path*`,
    permanent: false,

67-108: ```shell
#!/bin/bash
set -e
echo "Verifying project‐scoped route directories under (sidebar)…"

wallets under team/[team_slug]/[project_slug]/(sidebar)

fd --type d wallets apps/dashboard/src/app | grep '/(sidebar)/wallets' || echo "No project‐scoped wallets directory"

transactions under team/[team_slug]/[project_slug]/(sidebar)

fd --type d transactions apps/dashboard/src/app | grep '/(sidebar)/transactions' || echo "No project‐scoped transactions directory"

tokens under team/[team_slug]/[project_slug]/(sidebar)

fd --type d tokens apps/dashboard/src/app | grep '/(sidebar)/tokens' || echo "No project‐scoped tokens directory"


</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx (1)</summary>

`122-149`: **LGTM! Well-structured engine link type determination.**

The `getEngineLinkType` function follows a clear decision tree: check for cloud service first, then fall back to legacy engine instances. The logic is sound and the default to "cloud" is appropriate.

</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx (7)</summary>

`5-5`: **LGTM: Icon imports added for new UI elements.**

The new `ArrowLeftRightIcon` and `LockIcon` imports are correctly added to support the updated sidebar navigation items (Transactions and Vault respectively).



Also applies to: 11-11

---

`22-22`: **LGTM: New prop for dynamic engine link type.**

The `engineLinkType` prop with union type `"cloud" | "dedicated"` is well-defined and properly destructured. This enables dynamic behavior for the transactions link based on the engine configuration.



Also applies to: 25-25

---

`37-39`: **LGTM: Simplified wallet navigation.**

The renaming from "In-App Wallets" to "Wallets" and path simplification from `/connect/in-app-wallets` to `/wallets` aligns with the broader navigation restructuring described in the PR objectives.

---

`43-43`: **LGTM: Consistent removal of `/connect` prefix.**

The path updates for Account Abstraction and Universal Bridge consistently remove the `/connect` prefix, maintaining alignment with the overall navigation migration strategy.



Also applies to: 47-47

---

`57-64`: **LGTM: Assets to Tokens migration with proper labeling.**

The renaming from "Assets" to "Tokens" with the corresponding path change and "New" badge clearly communicates the feature update to users.

---

`66-78`: **LGTM: Well-implemented dynamic transactions link.**

The dynamic href logic based on `engineLinkType` is correctly implemented:
- Cloud engine type routes to `/transactions`  
- Dedicated engine type routes to `/engine/dedicated`
- The `isActive` function properly handles both possible paths for accurate navigation state

This provides a clean user experience while maintaining backward compatibility for different engine configurations.

---

`85-88`: **LGTM: Nebula to Vault migration with appropriate icon.**

The replacement of "Nebula" with "Vault" using the `LockIcon` is semantically appropriate and consistent with the overall navigation terminology updates.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

@vercel vercel bot temporarily deployed to Preview – wallet-ui June 20, 2025 20:04 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula June 20, 2025 20:04 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground June 20, 2025 20:04 Inactive
@vercel vercel bot temporarily deployed to Preview – login June 20, 2025 20:04 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 June 20, 2025 20:04 Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/universal-bridge/page.tsx (1)

4-4: Potential import path fragility

The relative import path ../../universal-bridge/webhooks/components/webhooks.client is quite deep and could be fragile if the directory structure changes.

Consider using an absolute import path with an alias (like @/ or @app/) for better maintainability:

-import { PayWebhooksPage } from "../../universal-bridge/webhooks/components/webhooks.client";
+import { PayWebhooksPage } from "@/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/components/webhooks.client";

Or consider moving the shared component to a common location if it's used by multiple pages.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c5fa3b1 and 860a12a.

📒 Files selected for processing (8)
  • apps/dashboard/redirects.js (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/footer/FooterLinksSection.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/components/webhooks.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/WebhooksTable.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/universal-bridge/page.tsx (1 hunks)
✅ Files skipped from review due to trivial changes (2)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/components/webhooks.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/footer/FooterLinksSection.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/WebhooksTable.tsx
  • apps/dashboard/redirects.js
🧰 Additional context used
🧠 Learnings (1)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/page.tsx (1)
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
🧬 Code Graph Analysis (2)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/layout.tsx (1)
apps/dashboard/src/@/components/ui/tabs.tsx (1)
  • TabPathLinks (213-244)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/universal-bridge/page.tsx (3)
apps/dashboard/src/@/api/projects.ts (1)
  • getProject (29-48)
apps/dashboard/src/@/components/ui/UnderlineLink.tsx (1)
  • UnderlineLink (6-16)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/components/webhooks.client.tsx (1)
  • PayWebhooksPage (64-144)
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: Size
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (10)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/page.tsx (2)

1-11: LGTM: Proper async params handling and imports

The component correctly implements the async server component pattern, properly awaiting the params Promise as recommended for Next.js server components.


12-17: LGTM: Proper error handling

Good error handling with redirect to team page when project is not found. The redirect path is consistent and appropriate.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx (4)

3-3: LGTM: Import path update

Good update to use absolute import path with @app alias, consistent with the broader codebase changes mentioned in the summary.


5-5: LGTM: Component delegation

Good separation of concerns by delegating to ContractsWebhooksPageContent. This improves modularity and makes the main page component cleaner.


10-13: LGTM: Efficient async operations

Using Promise.all for concurrent execution of getAuthToken() and params resolution is an efficient approach that reduces total waiting time.


25-41: LGTM: Updated content and component usage

The header update to "Contract Webhooks" and the delegation to ContractsWebhooksPageContent appropriately reflect the restructured webhook functionality with separate contract and universal bridge sections.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/universal-bridge/page.tsx (1)

1-11: LGTM: Proper async handling and structure

The component correctly implements the async server component pattern and has consistent import structure.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/layout.tsx (3)

1-11: LGTM: Proper layout structure and async handling

The layout component correctly implements the async server component pattern and provides a clean structure for the webhooks section.


24-37: Good tab navigation implementation

The TabPathLinks implementation provides clear navigation between Contract and Universal Bridge webhooks. The path construction is correct and the exactMatch: true for the Contract tab ensures proper active state handling.

The tab structure aligns well with the modular approach taken in the webhook pages, providing a unified entry point for both webhook types.


12-44: LGTM: Well-structured layout with proper spacing and containers

The layout provides good visual hierarchy with appropriate spacing (h-6, h-10) and uses consistent container classes (max-w-7xl) throughout. The flexbox structure allows for proper content flow and growth.

@vercel vercel bot temporarily deployed to Preview – wallet-ui June 20, 2025 20:07 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 June 20, 2025 20:07 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground June 20, 2025 20:07 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula June 20, 2025 20:07 Inactive
@vercel vercel bot temporarily deployed to Preview – login June 20, 2025 20:07 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 June 20, 2025 20:17 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula June 20, 2025 20:17 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui June 21, 2025 00:16 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 June 21, 2025 00:16 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground June 21, 2025 00:16 Inactive
Copy link
Member

jnsdls commented Jun 21, 2025


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • merge-queue - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@graphite-app
Copy link
Contributor

graphite-app bot commented Jun 21, 2025

Merge activity

<!--

## title your PR with this format: "[SDK/Dashboard/Portal] Feature/Fix: Concise title for the changes"

If you did not copy the branch name from Linear, paste the issue tag here (format is TEAM-0000):

## Notes for the reviewer

Anything important to call out? Be sure to also clarify these in your comments.

## How to test

Unit tests, playground, etc.

-->

<!-- start pr-codex -->

---

## PR-Codex overview
This PR focuses on restructuring and renaming various components and pages within the application, particularly transitioning terminology from "assets" to "tokens" and reorganizing file paths for clarity. It also includes the deletion of unused files and adjustments in imports.

### Detailed summary
- Deleted unused files related to `nebula` and `in-app-wallets`.
- Renamed components and pages from "assets" to "tokens".
- Updated file paths to reflect the new structure.
- Adjusted imports for consistency with new paths.
- Enhanced UI elements for better user experience.

> The following files were skipped due to too many changes: `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/create-vault-account.client.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/layout.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/ftux.client.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/layout.tsx`, `apps/dashboard/redirects.js`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/contract-webhooks/contract-webhooks-page.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/components/try-it-out.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/layout.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/key-management.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx`, `apps/dashboard/src/components/pay/PayAnalytics/PayEmbedFTUX.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/wallet-table/wallet-table-ui.client.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx`, `packages/nebula/package.json`, `pnpm-lock.yaml`

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Introduced a Vault section for secure key management, including a new layout and key management UI.
  - Added contract webhooks management with improved pages and navigation.

- **Improvements**
  - Renamed "Assets" to "Tokens" and "In-App Wallets" to "Wallets" throughout the dashboard.
  - Updated sidebar navigation labels, icons, and link destinations for clarity and consistency.
  - Enhanced "Transactions" section, replacing previous "Engine" references and updating related routes and UI.
  - Refined onboarding and FTUX experiences with clearer terminology and improved instructional content.
  - Improved contract import and table UI with updated labels and empty state messages.
  - Enhanced Pay analytics with richer code examples and a more flexible FTUX component.
  - Streamlined redirects and updated URL paths to remove deprecated segments for smoother navigation.
  - Improved pagination display and active link detection in navigation components.
  - Adjusted layout spacing, button sizes, and typography for improved visual consistency.
  - Updated footer and sidebar styling for better user experience.

- **Bug Fixes**
  - Fixed various redirect and navigation paths to align with new route structures.
  - Improved handling of pagination and active link states in navigation components.

- **Removals**
  - Removed Nebula analytics pages, components, and related tracking utilities.
  - Deleted unused tracking properties and constants.
  - Removed outdated Vault key management component replaced by new implementation.

- **Documentation**
  - Updated terminology in documentation and UI to reflect the shift from "assets" to "tokens".
  - Revised analytics event descriptions to use "token page" terminology.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@graphite-app graphite-app bot force-pushed the dashboard-navigation-changes branch from aad31d2 to eeb672d Compare June 21, 2025 00:36
@vercel vercel bot temporarily deployed to Preview – docs-v2 June 21, 2025 00:36 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui June 21, 2025 00:36 Inactive
@graphite-app graphite-app bot merged commit eeb672d into main Jun 21, 2025
24 checks passed
@graphite-app graphite-app bot deleted the dashboard-navigation-changes branch June 21, 2025 00:44
@vercel vercel bot temporarily deployed to Production – docs-v2 June 21, 2025 00:44 Inactive
@vercel vercel bot temporarily deployed to Production – wallet-ui June 21, 2025 00:44 Inactive
@coderabbitai coderabbitai bot mentioned this pull request Aug 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Dashboard Involves changes to the Dashboard. packages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants